<?php

namespace Admin\Model;

use Think\Model\RelationModel;

/**
 * 基础model
 */
class BaseModel extends RelationModel{

    /**
     *
     * 函数用途描述:获取数据列表
     * @date: 2017年7月10日 上午11:11:20
     *
     * @author : xiaohui
     * @param : [array]  $params    遵循thinkPHP
     * @param : [array]  field      查询字段
     * @param : [array]  where      查询条件
     * @param : [string] order      排序条件
     * @param : [string] rel        关联模型
     * @param : [int] showpage      分页数
     * @param : [array]  search     搜索条件   不支持表达式查询 例如： array('exp', 'IN(1,2,3)');
     *          array( 'id' => array( 'uid', 'in' ) )
     *          array( 'name' => array( 'name', '%like%' ) ) 模糊查询
     *          array( array( 'priceMin', 'elt' ), array( 'priceMax', 'egt' ), 'and' ) 区间查询
     * @return :[array]  data => 查询的数据    page => 分页数据
     */
    public function listData($params = array()) {
    
        $map = array();
    
        $where = $params['where']?$params['where']:array();
    
        $order = $params['order']?$params['order'].','.$this->getPk().' desc':$this->getPk().' desc';

        $field = $params['field']?$params['field']:'*';
        
        // 获取筛选条件  对应到I('get.')值
        if ($params['search']) {
            if (!empty($_POST)) {
                $_GET = $_POST;
            }
            foreach ($params['search'] as $k => $v) {
                if (in_array($v[0])) {
                    
                    if (I('get.'.$v[0][0]) && I('get.'.$v[1][1])) {
                        $exp = $v[2]?$v[2]:'and';
                        $map[$k] = array(array($v[0][1], trim(I('get.'.$v[0][0]))), array($v[1][1], trim(I('get.'.$v[1][1]))), $exp);
                    }
                    
                } else {
                    
                    $fieldVal = I('get.'.$v[0])?I('get.'.$v[0]):I('get.'.$k);
                    $fieldVal = trim($fieldVal);
                    if ($fieldVal) {
                        $exp = $v[1]?$v[1]:'eq';
                        if (stripos($exp, 'like') !== false) {
                            $fieldVal = str_replace('like' ,$fieldVal ,$exp);
                            $map[$k] = array('like', $fieldVal);
                        } else {
                            $map[$k] = array($exp, $fieldVal);
                        }
                    }
                    
                }
                
            }
            
        }
        // 筛选条件 有值就添加到条件$where
        if ($map) {
            $map['_logic'] = 'AND';
            if ($where) {
                $where['_complex'] = $map;
            } else {
                $where = $map;
            }
        }
        
        if ($params['showpage'] === false) {
            $params['showpage'] = 0;
        } else {
            if (empty($params['showpage'])) {
                $params['showpage'] = 10;
            }
        }
        
        if ($params['showpage'] != 0) {
            $p = $_GET['p']?$_GET['p']:1;
            $pagenum = $p.','.$params['showpage'];
        } else {
            $pagenum = false;
            $pageshow = '';
        }
    
        if ($params['rel']) {
            if ($pagenum !== false) {
                $data = $this->relation($params['rel'])->field($field)->where($where)->order($order)->page($pagenum)->select();
            } else {
                $data = $this->relation($params['rel'])->field($field)->where($where)->order($order)->select();
            }
        } else {
            if ($pagenum !== false) {
                $data = $this->field($field)->where($where)->order($order)->page($pagenum)->select();
            } else {
                $data = $this->field($field)->where($where)->order($order)->select();
            }
        }

        if ($pagenum !== false) {
            // 页码 
            $count = $this->where($where)->count();
            $Page = new \Think\Page($count,$params['showpage']);
            //分页跳转的时候保证查询条件
            foreach($where as $key=>$val) {
                if (is_array($val)) {
                    $val = $val[1];
                }
                $Page->parameter[$key] = $val;//urlencode($val);
            }
            // $Page->setConfig('theme','%HEADER% %FIRST% %UP_PAGE% div%LINK_PAGE% %DOWN_PAGE% %END%');
            $pageshow = $Page->show();
        }

        return array('list' => $data, 'page' => $pageshow, 'where' => $where);
    }

    /**
     * 添加数据
     * @param  array $data  添加的数据
     * @return int          新增的数据id
     */
    public function addData($data){
        // 去除键值首尾的空格
        foreach ($data as $k => $v) {
            $data[$k]=trim($v);
        }
        $id = $this->add($data);
        return $id;
    }

    /**
     * 修改数据
     * @param   array   $map    where语句数组形式
     * @param   array   $data   数据
     * @return  boolean         操作是否成功
     */
    public function editData($map,$data){
        // 去除键值首位空格
        foreach ($data as $k => $v) {
            $data[$k] = trim($v);
        }
        $result = $this->where($map)->save($data);
        if ($result !== false) {
            $result = true;
        }
        return $result;
    }

    /**
     * 删除数据
     * @param   array   $map    where语句数组形式
     * @return  boolean         操作是否成功
     */
    public function deleteData($map){
        if (empty($map)) {
            die('where为空的危险操作');
        }
        $result = $this->where($map)->delete();
        // if ($result !== false) {
        //     $result = true;
        // }
        return $result;
    }

    /**
     * 查询数据
     * @param   array   $map    where语句数组形式
     * @return  boolean         操作是否成功
     */
    public function infoData($map, $rel = false) {
        $result = $this->relation($rel)->where($map)->find();
        return $result;
    }

    /**
     * 数据排序
     * @param  array $data   数据源
     * @param  string $id    主键
     * @param  string $order 排序字段   
     * @return boolean       操作是否成功
     */
    public function orderData($data,$id='id',$order='order_number'){
        foreach ($data as $k => $v) {
            $v=empty($v) ? null : $v;
            $this->where(array($id=>$k))->save(array($order=>$v));
        }
        return true;
    }

    /**
     * 获取全部数据
     * @param  string $type  tree获取树形结构 level获取层级结构
     * @param  string $order 排序方式   
     * @return array         结构数据
     */
    public function getTreeData($type='tree',$order='',$name='name',$child='id',$parent='pid'){
        // 判断是否需要排序
        if(empty($order)){
            $data=$this->select();
        }else{
            $data=$this->order($order.' is null,'.$order)->select();
        }
        // 获取树形或者结构数据
        if($type=='tree'){
            $data=\Org\Nx\Data::tree($data,$name,$child,$parent);
        }elseif($type="level"){
            $data=\Org\Nx\Data::channelLevel($data,0,'&nbsp;',$child);
        }
        return $data;
    }

    /**
     * 获取分页数据
     * @param  subject  $model  model对象
     * @param  array    $map    where条件
     * @param  string   $order  排序规则
     * @param  integer  $limit  每页数量
     * @param  integer  $field  $field
     * @return array            分页数据
     */
    public function getPage($model,$map,$order='',$limit=10,$field=''){
        $count=$model
            ->where($map)
            ->count();
        $page=new_page($count,$limit);
        // 获取分页数据
        if (empty($field)) {
            $list=$model
                ->where($map)
                ->order($order)
                ->limit($page->firstRow.','.$page->listRows)
                ->select();         
        }else{
            $list=$model
                ->field($field)
                ->where($map)
                ->order($order)
                ->limit($page->firstRow.','.$page->listRows)
                ->select();         
        }
        $data=array(
            'data'=>$list,
            'page'=>$page->show()
            );
        return $data;
    }





}
